<?php
/**
 * 分页类
 * @author liudaiming
 * @version 2014-3-3
 */
class Pager
{
    /**
     * config ,public
     */
    var $page_name = 'page';
    var $next_page = '>'; //下一页
    var $pre_page = '<'; //上一页
    var $first_page = 'First'; //首页
    var $last_page = 'Last'; //尾页
    var $pre_bar = '<<'; //上一分页条
    var $next_bar = '>>'; //下一分页条
    var $format_left = '[';
    var $format_right = ']';
    var $is_ajax = false; //是否支持AJAX分页模式
    /**
     * private
     */
    var $pagebarnum = 10; //控制记录条的个数。
    var $total = 0; //总数
    var $totalpage = 0; //总页数
    var $ajax_action_name = ''; //AJAX动作名
    var $nowindex = 1; //当前页
    var $url = ""; //url地址头
    var $offset = 0;
    /**
     * @param int $total			数据总数
     * @param int $perpage			每页显示数据数量
     * @param int $nowindex			当前页码
     * @param string $url			网页基本路径
     * @param unknown_type $ajax
     */
    public function __construct ($total, $perpage = 10, $nowindex = '', $url = null, 
    $ajax = null)
    {
        $total = intval($total);
        $this->total = $total;
        $perpage = intval($perpage);
        $nowindex = intval($nowindex);
        if ($total < 0) {
            $this->error(__FUNCTION__, $total . ' is not a positive integer!');
        }
        if ($perpage <= 0) {
            $this->error(__FUNCTION__, $perpage . ' is not a positive integer!');
        }
        $this->_set_nowindex($nowindex);
        $this->_set_url($url);
        $this->totalpage = ceil($total / $perpage);
        $this->offset = ($this->nowindex - 1) * $perpage;
        if (! empty($ajax)) {
            $this->open_ajax($ajax); //打开AJAX模式
        }
    }
    /**
     * 设定类中指定变量名的值，如果改变量不属于这个类，将throw一个exception
     *
     * @param string $var
     * @param string $value
     */
    public function set ($var, $value)
    {
        if (in_array($var, get_object_vars($this))) {
            $this->$var = $value;
        } else {
            $this->error(__FUNCTION__, $var . " does not belong to PB_Page!");
        }
    }
    /**
     * 打开AJAX模式
     *
     * @param string $action 默认ajax触发的动作。
     */
    public function open_ajax ($action)
    {
        $this->is_ajax = true;
        $this->ajax_action_name = $action;
    }
    public function show_info ($style)
    {
        return '<span class="' . $style . '">第' . $this->nowindex . '页/共' .
         $this->totalpage . '页</span>';
    }
    /**
     * 获取显示"下一页"的代码
     *
     * @param string $style
     * @return string
     */
    public function next_page ($style = '')
    {
        if ($this->nowindex < $this->totalpage) {
            return $this->_get_link($this->_get_url($this->nowindex + 1), 
            $this->next_page, $style);
        }
        return '<span class="' . $style . '">' . $this->next_page . '</span>';
    }
    /**
     * 获取显示“上一页”的代码
     *
     * @param string $style
     * @return string
     */
    public function pre_page ($style = '')
    {
        if ($this->nowindex > 1) {
            return $this->_get_link($this->_get_url($this->nowindex - 1), 
            $this->pre_page, $style);
        }
        return '<span class="' . $style . '">' . $this->pre_page . '</span>';
    }
    /**
     * 获取显示“首页”的代码
     *
     * @return string
     */
    public function first_page ($style = '')
    {
        if ($this->nowindex == 1) {
            return '<span class="' . $style . '">' . $this->first_page .
             '</span>';
        }
        return $this->_get_link($this->_get_url(1), $this->first_page, $style);
    }
    /**
     * 获取显示“尾页”的代码
     *
     * @return string
     */
    public function last_page ($style = '')
    {
        if ($this->nowindex == $this->totalpage) {
            return '<span class="' . $style . '">' . $this->last_page . '</span>';
        }
        return $this->_get_link($this->_get_url($this->totalpage), 
        $this->last_page, $style);
    }
    public function nowbar ($style = '', $nowindex_style = '')
    {
        $plus = ceil($this->pagebarnum / 2);
        if ($this->pagebarnum - $plus + $this->nowindex > $this->totalpage)
            $plus = ($this->pagebarnum - $this->totalpage + $this->nowindex);
        $begin = $this->nowindex - $plus + 1;
        $begin = ($begin >= 1) ? $begin : 1;
        $return = '';
        for ($i = $begin; $i < $begin + $this->pagebarnum; $i ++) {
            if ($i <= $this->totalpage) {
                if ($i != $this->nowindex)
                    $return .= $this->_get_text(
                    $this->_get_link($this->_get_url($i), $i, $style));
                else
                    $return .= $this->_get_text(
                    '<span class="' . $nowindex_style . '">' . $i . '</span>');
            } else {
                break;
            }
            $return .= "\n";
        }
        unset($begin);
        return $return;
    }
    /**
     * 获取显示跳转按钮的代码
     *
     * @return string
     */
    public function select ()
    {
        $return = '<select name="PB_Page_Select" onchange="javascript:pageskip(this.value);">';
        for ($i = 1; $i <= $this->totalpage; $i ++) {
            if ($i == $this->nowindex) {
                $return .= '<option value="' . $i . '" selected>' . $i .
                 '</option>';
            } else {
                $return .= '<option value="' . $i . '">' . $i . '</option>';
            }
        }
        unset($i);
        $return .= '<script type = "text/javascript">';
        $return .= 'function pageskip(num){window.location.href="' .
         $this->_get_url() . '&' . $this->page_name . '="+num}';
        $return .= '</script>';
        $return .= '</select>';
        return $return;
    }
    /**
     * 获取mysql 语句中limit需要的值
     *
     * @return string
     */
    public function offset ()
    {
        return $this->offset;
    }
    /**
     * 控制分页显示风格（你可以增加相应的风格）
     *
     * @param int $mode
     * @return string
     */
    public function show ($mode = 1)
    {
        switch ($mode) {
            case '1':
                $this->next_page = '下一页';
                $this->pre_page = '上一页';
                $this->first_page = '首页';
                $this->last_page = '尾页';
                $this->format_left = '';
                $this->format_right = '';
                return $this->show_info('show_info') . $this->first_page('fy') .
                 $this->pre_page('fy') . $this->nowbar('fy', 'fy cur') .
                 $this->next_page('fy') . $this->last_page('fy') .
                 '<span class="fy_select">第 ' . $this->select() . ' 页</span>';
                break;
        }
    }
    /*----------------private function (私有方法)-----------------------------------------------------------*/
    /**
     * 设置url头地址
     * @param: String $url
     * @return boolean
     */
    public function _set_url ($url = "")
    {
        if (! empty($url)) {
            //手动设置
            $this->url = $url . ((stristr($url, '?')) ? '&' : '?') .
             'total=' . $this->total . '&' . $this->page_name . "=";
        } else {
            //自动获取
            if (empty($_SERVER['QUERY_STRING'])) {
                //不存在QUERY_STRING时
                $this->url = $_SERVER['REQUEST_URI'] . "?" .
                 $this->page_name . "=";
            } else {
                //
                if (stristr($_SERVER['QUERY_STRING'], 
                $this->page_name . '=')) {
                    //地址存在页面参数
                    $this->url = str_replace(
                    $this->page_name . '=' . $this->nowindex, '', 
                    $_SERVER['REQUEST_URI']);
                    $last = $this->url[strlen($this->url) - 1];
                    if ($last == '?' || $last == '&') {
                        $this->url .= $this->page_name . "=";
                    } else {
                        $this->url .= '&' . $this->page_name . "=";
                    }
                } else {
                    //
                    $this->url = $_SERVER['REQUEST_URI'] .
                     '&' . $this->page_name . '=';
                } //end if
            } //end if
        } //end if
    }
    /**
     * 设置当前页面
     *
     */
    public function _set_nowindex ($nowindex)
    {
        if (empty($nowindex)) {
            //系统获取
            if (isset($_GET[$this->page_name])) {
                $this->nowindex = intval($_GET[$this->page_name]);
            }
        } else {
            //手动设置
            $this->nowindex = intval($nowindex);
        }
    }
    /**
     * 为指定的页面返回地址值
     *
     * @param int $pageno
     * @return string $url
     */
    public function _get_url ($pageno = 1)
    {
        return $this->url . $pageno;
    }
    /**
     * 获取分页显示文字，比如说默认情况下_get_text('<a href="">1</a>')将返回[<a href="">1</a>]
     *
     * @param String $str
     * @return string $url
     */
    public function _get_text ($str)
    {
        return $this->format_left . $str . $this->format_right;
    }
    /**
     * 获取链接地址
     */
    public function _get_link ($url, $text, $style = '')
    {
        $style = (empty($style)) ? '' : 'class="' . $style . '"';
        if ($this->is_ajax) {
            //如果是使用AJAX模式
            return '<a ' . $style . ' href="javascript:' .
             $this->ajax_action_name . '(\'' . $url . '\')">' . $text . '</a>';
        } else {
            return '<a ' . $style . ' href="' . $url . '">' . $text . '</a>';
        }
    }
    /**
     * 出错处理方式
     */
    public function error ($function, $errormsg)
    {
        die(
        'Error in file <b>' . __FILE__ . '</b> ,Function <b>' . $function .
         '()</b> :' . $errormsg);
    }
}